package com.adtech.export.config;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.adtech.export.transformer.CellTransformer;

/**
 * 单元格配置
 * 
 * @author liulm
 * @author Puzhijun
 */
public class CellColConfig<T> extends BaseConfig {
	/** 列的属性名 */
	private String fieldName;
	/** 
	 * 数据格式化,已经过时请使用
	 * {@link cellStransformer}
	 * @see CellTransformer
	 *  */
	@Deprecated
	private String formatPattern;
	/** 列头 */
	private String colHeader;
	/** 列的位置 */
	private short position = 0;
	/** 列宽 */
	private float width;
	/** 列的转换器 */
	private CellTransformer<T> cellStransformer;

	/**
	 * 返回此列的转换对象
	 * 
	 * @return CellTransformer
	 * @see CellTransformer
	 */
	public CellTransformer<T> getCellStransformer() {
		return cellStransformer;
	}

	/**
	 * 设置此列的转换对象
	 * 
	 * @param cellStransformer
	 * @see CellTransformer
	 */
	public void setCellStransformer(CellTransformer<T> cellStransformer) {
		this.cellStransformer = cellStransformer;
	}

	/**
	 * 获得列头名
	 * 
	 * @return
	 */
	public String getColHeader() {
		return colHeader;
	}

	/**
	 * 设置列头名
	 * 
	 * @param colHeader
	 */
	public void setColHeader(String colHeader) {
		this.colHeader = colHeader;
	}

	/**
	 * 获得取数据的字段
	 * 
	 * @return
	 */
	public String getFieldName() {
		return fieldName;
	}

	/**
	 * 设置取数据的字段 例子：user.getAddr().getDesc();字段设置 "addr.desc"
	 * user.getAddrMap().get("desc");字段设置 "addr.desc"
	 * 
	 * @param fieldName
	 */
	public void setFieldName(String fieldName) {
		this.fieldName = fieldName;
	}

	/**
	 * 获得格式化串。
	 * 
	 * @return 此方法已经过时，请使用{@link setCellStransformer()} 方法
	 * @see CellTransformer
	 */
	@Deprecated
	public String getFormatPattern() {
		return formatPattern;
	}

	/**
	 * 设置格式化串。当是java.lang.Number或java.util.Date类型或子类型时，设置对其格式化串。
	 * 参考java.text.SimpleDateFormat和java.text.DecimalFormat的模式设置。 此方法已经过时，请使用
	 * {@link setCellStransformer}方法
	 * 
	 * @param formatPattern
	 * @see CellTransformer
	 */
	@Deprecated
	public void setFormatPattern(String formatPattern) {
		this.formatPattern = formatPattern;
	}

	/**
	 * 获得单元格列的位置
	 * 
	 * @return
	 */
	public short getPosition() {
		return position;
	}

	/**
	 * 设置单元格列位置。输入数大于等于0。当为0时，为不显示。
	 * 
	 * @param position
	 */
	public void setPosition(short position) {
		if (position >= 0)
			this.position = position;
	}

	/**
	 * 获得单元格列宽度 单位:mm
	 * 
	 * @return
	 */
	public float getWidth() {
		return width;
	}

	/**
	 * 设置单元格列宽度，必须大于0。单位:mm
	 * 
	 * @param width
	 */
	public void setWidth(float width) {
		if (width > 0)
			this.width = width;
	}

	/**
	 * position属性按升序排列
	 * 
	 * @param cellColConfigList
	 */
	private static <T> void sort(List<CellColConfig<T>> cellColConfigList) {
		CellColConfig<T> cellColConfig = new CellColConfig<T>();

		Collections.sort(cellColConfigList,
				cellColConfig.new CellColComparator());
	}

	public class CellColComparator implements Comparator<CellColConfig<T>> {

		/**
		 * @param o1
		 * @param o2
		 * @return 随第一个参数o1小于、等于或大于第二个参数o2而分别返回负整数、零或正整数。
		 */
		@Override
		public int compare(CellColConfig<T> o1, CellColConfig<T> o2) {
			return o1.getPosition() - o2.getPosition();
		}

	}

	/**
	 * 获得将显示的列数组。
	 * 
	 * @param cellColConfigList
	 * @return
	 */
	public static <T> CellColConfig<T>[] getShowCols(
			List<CellColConfig<T>> cellColConfigList) {
		if (cellColConfigList == null)
			throw new IllegalArgumentException("列配置list不能为null！");

		List<CellColConfig<T>> showCol = new ArrayList<CellColConfig<T>>();
		// 去除不显示的。

		for (int i = 0, size = cellColConfigList.size(); i < size; i++) {
			if (cellColConfigList.get(i).getPosition() > 0) {
				showCol.add(cellColConfigList.get(i));
			}
		}
		// 排序
		sort(showCol);

		@SuppressWarnings("unchecked")
		CellColConfig<T>[] result = new CellColConfig[showCol.size()];
		for (int index = 0; index < result.length; index++) {
			result[index] = showCol.get(index);
		}

		return result;
	}
}
